﻿using System;
using System.Collections.Generic;
using System.Text;

namespace PW.Mini.SlepowronskiJ.Siec.Algorytmy
{
    [Serializable]
    public abstract class WzrostBleduWalidacyjnego
    {
        /// <summary>
        /// wejscia/wyjscia walidacyjne
        /// </summary>
        ///
        protected double[][][] daneWalidacyjne;

        /// <summary>
        /// maksymalny wzrost bledu walidacacyjnego
        /// </summary>
        ///
        protected float maxWzrostBleduWalidacyjnego = 3;

        /// <summary>
        /// najlepszy osiagniety blad
        /// </summary>
        ///
        protected double minBlad;

        /// <summary>
        /// odpowiadający minBlad osiagniety blad testowy
        /// </summary>
        ///
        protected double minBladTestowy;

        /// <summary>
        /// numer iteracji w ktorej osiagnieto najlepszy blad
        /// </summary>
        ///
        protected int numerIteracjiMinBlad;

        /// <summary>
        /// flaga czy algorytm powinien przerwac obliczenia i ewentualnie przywrocic siec do najlepszej osiagnietej
        /// </summary>
        ///
        protected bool shouldStop;

        /// <summary>
        /// czy przywrocic siec do tej z najmniejszym osiagnietym bledem
        /// </summary>
        ///
        protected bool przywrocSiec;


        public double MinBlad
        {
            get { return minBlad; }
        }

        public float MaxWzrostBleduWalidacyjnego
        {
            get { return maxWzrostBleduWalidacyjnego; }
            set { maxWzrostBleduWalidacyjnego = value; }
        }

        public double[][][] DaneWalidacyjne
        {
            get { return daneWalidacyjne; }
            set { daneWalidacyjne = value; }
        }

        public WzrostBleduWalidacyjnego(float maxWzrostBleduWalidacyjnego, bool przywrocSiec)
        {
            this.maxWzrostBleduWalidacyjnego = maxWzrostBleduWalidacyjnego;
            this.przywrocSiec = przywrocSiec;
        }

        protected virtual double WyliczObecnyBladValidacyjny()
        {
            if (daneWalidacyjne != null && daneWalidacyjne.Length > 0 && daneWalidacyjne[0].Length > 0)
                return Monitor.TestowanieNauczeniaSieci.UruchomTestowanieNauczeniaSieci(
                    daneWalidacyjne[0], daneWalidacyjne[1], false);
            return double.MaxValue;
        }

        public abstract void PrzywrocNajlepszaSiec();

    }
}
